package joffice_vad;

import java.io.File;

import com.sun.jna.Library;
import com.sun.jna.Native;

import cn.rmshadows.joffice.JofficeApp;
import cn.rmshadows.joffice.JofficeToolKit;

/**
 * Windows & Linux Only! OSX not support! 要求输入文件是pcm文件
 * 
 * @author ryan
 * @description: 仅支持windows和linux平台
 */
public class Jvad {
	// This is the standard, stable way of mapping, which supports extensive
	// customization and mapping of Java to native types.
	/**
	 * Linux下加载 libjvad.3.so
	 * 
	 * @author ryan
	 * @description:Linux下调用libjvad.3.so
	 * @param:
	 * @return:
	 */
	protected interface JvadLibrary extends Library {
		JvadLibrary INSTANCE = (JvadLibrary) Native.load("jvad.3", JvadLibrary.class);

		// jvad linux方法
		int jvad_file(String filename);
	}

	/**
	 * Linux下的jvad方法
	 * 
	 * @param filepath pcm文件路径
	 * @return 执行状态值
	 */
	public static int linux_jvad(String filepath) {
		int status = -1;
		if ((status = JvadLibrary.INSTANCE.jvad_file(filepath)) != 0) {//如果调用共享库失败，就尝试执行可执行文件
			try {
				// 复制到当前路径的target.pcm
				File sf = new File(filepath);
				File df = new File("." + JofficeApp.file_sp + "target.pcm");
				JofficeToolKit.copyFileUsingFileChannels(sf, df);
				// 再执行jvad可执行文件 .substring(0, 1)
				status = Integer.valueOf(JofficeToolKit.execCommand("res/Linux/jvad/jvad").split(":")[0]);
				df.delete();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		return status;
	}

	/**
	 * Windows 下不调用dll，直接运行exe文件，要求64位系统
	 * 
	 * @param filepath pcm文件路径
	 * @return 执行返回值
	 */
	public static int windows_jvad(String filepath) {
		int status = -1;
		try {
			// 复制到当前路径的target.pcm
			File sf = new File(filepath);
			File df = new File("." + JofficeApp.file_sp + "target.pcm");
			JofficeToolKit.copyFileUsingFileChannels(sf, df);
			// 再执行jvad可执行文件
			status = Integer.valueOf(JofficeToolKit.execCommand("res\\Windows\\jvad\\jvad.exe").split(":")[0]);
			df.delete();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return status;
	}

	/**
	 * 供外界调用的方法,要求输入文件是pcm文件
	 * 
	 * @param filepath pcm文件
	 * @return 成功=0 初始 = -1
	 */
	public static int Jvad_File(String filepath) {
		int status = -1;
		initJvad();
		if (JofficeApp.isWindows) {
			try {
				status = windows_jvad(filepath);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else {
			try {
				status = linux_jvad(filepath);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return status;
	}

	/**
	 * 初始化Jvad文件夹等
	 */
	private static void initJvad() {
		File jvad_output_dir = new File("jvad_output");
		File target_pcm = new File("target.pcm");
		// 新建jvad_output文件夹
		if (!jvad_output_dir.exists()) {
			jvad_output_dir.mkdir();
		} else { // 如果存在就清空文件夹
			// 如果不是文件夹，删掉
			if (!jvad_output_dir.isDirectory()) {
				jvad_output_dir.delete();
				jvad_output_dir.mkdir();
			} else {
				// 清空
				for (File i : jvad_output_dir.listFiles()) {
					i.delete();
				}
			}
		}
		// 删除target.pcm文件
		if (target_pcm.exists()) {
			target_pcm.delete();
		}
	}

}
